/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package inovacao.dao;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JOptionPane;

//classe genérica
public class GenericDAO<T> {

    //uma fábrica para gerenciadores de entidades	
    private static EntityManagerFactory emf;
    //um gerenciador de entidade
    private EntityManager em;
    //representa (o)s resultados de uma consulta
    private Query query;
    //construtora

    public GenericDAO() {
        //cria a fábrica para se criar EntityManagers a partir
        // de um contexto de persistência chamado put1			
        //emf = Persistence.createEntityManagerFactory("inovacaoPU");
        //cria um EntityManager para o contexto put1
        //em = emf.createEntityManager();



        Map<String, String> dbProps = new HashMap<String, String>();
        String host = "";
        String instancia = "";
        String user = "";
        String senha = "";
        try {
            FileReader arq = new FileReader("C:/Users/Giovani/Desktop/conex.txt");
            BufferedReader lerArq = new BufferedReader(arq);
            host = lerArq.readLine();// lê a primeira linha // lê da segunda até a última linha
            instancia = lerArq.readLine();
            user = lerArq.readLine();
            senha = lerArq.readLine();
            arq.close();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
//System.out.println(host+ " - " + instancia +" - " + user + " - " + senha);
        if ("Linux".equals(System.getProperty("os.name"))) {
            dbProps.put("javax.persistence.jdbc.url", String.format("jdbc:jtds:sqlserver://%s/", host, "TESTE"));
            dbProps.put("javax.persistence.jdbc.driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
            dbProps.put("javax.persistence.jdbc.password", senha);
            dbProps.put("javax.persistence.jdbc.user", user);
        } else {
            dbProps.put("javax.persistence.jdbc.url",
                    String.format("jdbc:sqlserver://%s\\%s:1433;databaseName=%s",
                    host, instancia, "TESTE"));
            dbProps.put("javax.persistence.jdbc.driver",
                    "com.microsoft.sqlserver.jdbc.SQLServerDriver");
            dbProps.put("javax.persistence.jdbc.password", senha);
            dbProps.put("javax.persistence.jdbc.user", user);            
            dbProps.put("eclipselink.ddl-generation", "create-tables");
        }
        try {
            EntityManagerFactory fact = Persistence.createEntityManagerFactory("inovacaoPU", dbProps);
            em = fact.createEntityManager();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }

    }//fim da construtora

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    public void abreConexao() {
        if (!em.isOpen()) {
            if (!emf.isOpen()) {
                emf = Persistence.createEntityManagerFactory("inovacaoPU");
                em = emf.createEntityManager();
            }
        }
    }

    public EntityManager getGerenciador() {
        return em;
    }
    //método que persiste um objeto

    public boolean criar(T obj) {
        //caso não exista um gerenciador aberto        
        if (!em.isOpen()) {
            //cria um EntityManager para o contexto put1	
            em = emf.createEntityManager();
        }//fim do if
        //obtém uma transação e a inicia
        em.getTransaction().begin();

        try {
            //persiste o objeto
            em.persist(obj);
            //conclui a transação com um commit
            em.getTransaction().commit();
            return true;

        } catch (Exception e) {

            //caso exista um problema exucuta-se um rollback na           51        transação
            em.getTransaction().rollback();
            return false;

        } finally {
            //fecha o gerenciador
            em.close();
        }

    }//fim do método que persiste o objeto
    //método que recupera todas as intâncias de pessoas

    public void remover(T o) {
        abreConexao();
        em.getTransaction().begin();
        Object x = em.merge(o);
        em.remove(x);
        em.getTransaction().commit();

    }

    public void atualizar(T atualizado) {
        abreConexao();
        em.getTransaction().begin();
        em.merge(atualizado);
        em.getTransaction().commit();

    }

    private void fechaConexao() {
        if (em.isOpen()) {
            if (emf.isOpen()) {
                em.close();
                emf.close();
            }
        }
    }

    public void persist(T object) {
        em.getTransaction().begin();
        try {
            em.persist(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }
}
